#ifdef OSGI_USE_15S_HEADER
#include "../interface/InterfaceDef.h"
#include "osgi-core/osgi-predefined.h"
#else // OSGI_USE_15S_HEADER
#ifndef OSGI_CORE_ISETTINGSERVICE_H__
#define OSGI_CORE_ISETTINGSERVICE_H__

#include "IService.h"
#include "osgi-predefined.h"

OSGI_NAMESPACE_BEGIN

enum confingType
{
    INI = 0,
    XML = 1
};

OSGI_INTERFACE IMapStringToStringEnumer
{
	virtual ~IMapStringToStringEnumer() {}

	virtual int OSGI_API Count() = 0;
	virtual const char* OSGI_API GetKey(int num) = 0;
	virtual const char* OSGI_API GetValue(int num) = 0;
    virtual const char* OSGI_API GetValue(const char * key) = 0;
	virtual void OSGI_API Destroy() = 0;
};


//OSGI_INTERFACE IStringEnumer
//{
//	virtual ~IStringEnumer() {}

//	virtual int OSGI_API Count() = 0;
//	virtual const char* OSGI_API GetValue(int num) = 0;
//	virtual void OSGI_API Destroy() = 0;
//};

#define IID_ConfigParser "IID_ConfigParser"
#define SID_AppConfigParser "SID_AppConfigParser"

//        //加载文件
//        virtual bool MKRAPI LoadFile(
//            const char * fName) = 0;


OSGI_INTERFACE IINIConfigParser : public IService
{
public:

    virtual ~IINIConfigParser(){}

    ///section
    //获取section的数量
    virtual int MKRAPI getSectionNum() = 0;

    //获取所有section的vector
    virtual bool MKRAPI getSections(IStringEnumer * pSections) = 0;

    //判断是否存在section
    virtual bool MKRAPI HasSection(const char * sectionID) = 0;

    //移除section
    virtual bool MKRAPI RemoveSection(const char* sectionID) = 0;

    //增加section
    virtual bool MKRAPI AddSection(const char* sectionID) = 0;

    ///key
    //移除section下的key
    virtual bool MKRAPI RemoveKey(const char* sectionID,const char * key) = 0;

    //在section下增加key-value值
    virtual bool MKRAPI AddKey(const char* sectionID,const char * key,const char *value) = 0;

    //判断是否存在key
    virtual bool MKRAPI HasKey(const char * sectionID,const char *key) = 0;

    ///value
    //获取key的值，如果此key对应的value不存在，则赋予默认值
    virtual bool MKRAPI GetValueOrDefault(
        const char *sectionID,          //入参，sectionID
        const char *key,                //入参，key值
        const char **value,              //出参，获取到的值
        const char *defaultValue) = 0;  //入参，获取失败则将此值赋予value

    //修改section下key对应的value的值,不存在返回false
    virtual bool MKRAPI SetValue(
        const char *sectionID,
        const char *key,
        const char * value) = 0;

    //文件另存为
    virtual bool MKRAPI SaveAs(const char* fName,const char * fPath = 0) = 0;

    virtual void destroy() = 0;

};

OSGI_INTERFACE IXmlNode
{
    virtual IXmlNode * MKRAPI copy() = 0;
    //<node text = “aaa”>value</node>
    //value attr         text
    //获取此节点的第一个子节点
    virtual IXmlNode * MKRAPI GetChildNode() = 0;

    //获取此节点的下一个节点
    virtual IXmlNode * MKRAPI GetNextNode() = 0;

    //返回当前节点的节点值，return node
    virtual int MKRAPI GetNodeValue(const char ** nodeValue) = 0;

    //修改当前节点的node的值
    virtual void MKRAPI SetNodeValue(const char * nodeValue) = 0;

    //获取当前节点的文本值，return value
    virtual int MKRAPI GetNodeText(const char ** nodeText) = 0;

    //修改当前节点的text的值，有-》直接修改，无-》增加后赋值
    virtual void MKRAPI SetNodeText(const char * text) = 0;

    //获取当前节点的属性值，传递属性名（text），返回其值（aaa）
    virtual int MKRAPI GetAttributeValue(const char * attribute, const char ** value) = 0;

    //获取当前节点下的属性枚举合集
    virtual bool MKRAPI GetAttributes(IMapStringToStringEnumer * attributes) = 0;

    //设置当前节点的属性和值，有->直接修改，没有->新建后赋值
    virtual void MKRAPI SetAttribute(const char * name, const char * value) = 0;

    //删除属性
    virtual void MKRAPI RemoveAttribute(const char * name) = 0;

    //在这个子节点之下增加子节点,节点名称为传输的值
    virtual void MKRAPI InsertChildElement(const char * addChildValue) = 0;

    //替换子节点
    virtual void MKRAPI ReplaceChild(IXmlNode * replace, IXmlNode * with) = 0;

    //删除子节点
    virtual bool MKRAPI RemoveChild(IXmlNode *remove) = 0;

    virtual ~IXmlNode(){}
};

OSGI_INTERFACE IXpathNode
{
    virtual IXmlNode * MKRAPI GetChildNode() = 0;

    //获取此节点的下一个节点
    virtual IXmlNode * MKRAPI GetNextNode() = 0;

    //返回当前节点的节点值，return node
    virtual int MKRAPI GetNodeValue(const char ** nodeValue) = 0;

    //修改当前节点的node的值
    virtual void MKRAPI SetNodeValue(const char * nodeValue) = 0;

    //获取当前节点的文本值，return value
    virtual int MKRAPI GetNodeText(const char ** nodeText) = 0;

    //修改当前节点的text的值，有-》直接修改，无-》增加后赋值
    virtual void MKRAPI SetNodeText(const char * text) = 0;

    //获取当前节点的属性值，传递属性名（text），返回其值（aaa）
    virtual int MKRAPI GetAttributeValue(const char * attribute, const char ** value) = 0;

    //获取当前节点下的属性枚举合集
    virtual bool MKRAPI GetAttributes(IMapStringToStringEnumer * attributes) = 0;

    //设置当前节点的属性和值，有->直接修改，没有->新建后赋值
    virtual void MKRAPI SetAttribute(const char * name, const char * value) = 0;

    //删除属性
    virtual void MKRAPI RemoveAttribute(const char * name) = 0;

    //在这个子节点之下增加子节点,节点名称为传输的值
    virtual void MKRAPI InsertChildElement(const char * addChildValue) = 0;

    //替换子节点
    virtual void MKRAPI ReplaceChild(IXmlNode * replace, IXmlNode * with) = 0;

    //删除子节点
    virtual bool MKRAPI RemoveChild(IXmlNode *remove) = 0;

    virtual ~IXpathNode(){}
};

OSGI_INTERFACE IXMLConfigParser : public IService
{
    virtual IXmlNode * MKRAPI GetRootNode() = 0;

    virtual void MKRAPI destroy() = 0;

    virtual ~IXMLConfigParser(){}
};



#define IID_ConfigParserFactory "IID_ConfigParserFactory"
#define SID_ConfigParserFactory "SID_ConfigParserFactory"
OSGI_INTERFACE IConfigParserFactory : public IService
{
    virtual ~IConfigParserFactory() {}

    //返回的指针在使用完之后切记需要手动释放
    virtual IService * MKRAPI CreateConfigParser(
                const char * fName,
                const char * bundleName,
                confingType fileType) = 0;

    virtual void MKRAPI Finalize() = 0;

};

OSGI_NAMESPACE_END

#endif // OSGI_CORE_ISETTINGSERVICE_H__
#endif // OSGI_USE_15S_HEADER
